package f.h.dragon.util;

/**
 * Arrays: 数组操作工具类，对java.util.Arrays中没有或私有的方法做补充
 * 
 * @author Wenlong Meng(wenlong.meng@gmail.com)
 * @version 1.0 at 2012/02/01
 * @since 1.0
 */
public class Arrays {

	//Logic
	/**
	 * Swaps x[a] with x[b]: 通过位异或运算实现，利用位运算特性(n^m^m=m^n^m=n), 高效、简洁
	 * 
	 * @param x
	 * @param a
	 * @param b
	 */
	public static void swap(int x[], int a, int b) {
		x[a] ^= x[b];
		x[b] ^= x[a];
		x[a] ^= x[b];
	}
	
	/**
	 * Swaps x[a] with x[b]：通过中间变量实现，简单明了，但需要借助临时变量t，某些情况会对内存造成影响
	 * 
	 * @param x
	 * @param a
	 * @param b
	 * 
	 * @deprecated see {@link #swap(int[], int, int)}
	 */
	public static void swap1(int x[], int a, int b) {
		int t = x[a];
		x[a] = x[b];
		x[b] = t;
	}
	
	/**
	 * Swaps x[a] with x[b]：通过和差实现,简单数学原理，易理解，操作方式类似"异或实现", 但该实现可能导致溢出
	 * 
	 * @param x
	 * @param a
	 * @param b
	 * 
	 * @deprecated see {@link #swap(int[], int, int)}
	 */
	public static void swap2(int x[], int a, int b) {
		x[a] += x[b];//可能导致溢出
		x[b] = x[a] - x[b];
		x[a] = x[a] - x[b];
	}

	/**
	 * Swaps x[a .. (a+n-1)] with x[b .. (b+n-1)].
	 * 
	 * @param x
	 * @param a
	 * @param b
	 * @param n
	 */
	public static void swap(int x[], int a, int b, int n) {
		for (int i = 0; i < n; i++, a++, b++){
			swap(x, a, b);
		}
	}
	
	/**
	 * reswaps x[(a+n-1) .. a] with x[(b+n-1) .. b].
	 * 
	 * @param x
	 * @param a
	 * @param b
	 * @param n
	 */
	public static void reswap(int x[], int a, int b, int n) {
		for (int i = 0; i < n; i++, a--, b--){
			swap(x, a, b);
		}
	}
	
	/**
	 * test...
	 * 
	 * @param args
	 */
	public static void main(String[] args){
		int[] is = {1,2};
		System.out.println(java.util.Arrays.toString(is));
		swap(is, 0, 1);
		System.out.println(java.util.Arrays.toString(is));
		swap(is, 0, 1);
		System.out.println(java.util.Arrays.toString(is));
		swap(is, 0, 1);
		System.out.println(java.util.Arrays.toString(is));
	}

}
